// 事件发布器单例类，封装事件的分发与监听，便于全局事件通信
class EventPublisher {
	/** 单例实例，确保全局唯一 */
	private static instance: EventPublisher;

	/** 内部事件目标对象，用于事件的实际分发和监听 */
	private readonly eventTarget: EventTarget;

	/** 私有构造函数，禁止外部实例化，初始化事件目标对象 */
	private constructor() {
		this.eventTarget = new EventTarget();
	}

	/**
	 * 获取事件发布器的单例实例
	 *
	 * @returns {EventPublisher} 全局唯一的事件发布器实例
	 */
	public static getInstance(): EventPublisher {
		if (!EventPublisher.instance) {
			EventPublisher.instance = new EventPublisher();
		}
		return EventPublisher.instance;
	}

	/**
	 * 分发事件（支持所有 Event 类型）
	 *
	 * @param {E} event - 需要分发的事件对象
	 * @returns {void}
	 */
	public dispatchEvent<E extends Event = Event>(event: E): void {
		try {
			this.eventTarget.dispatchEvent(event);
		} catch (error) {
			// 捕获并输出分发事件时的异常，避免全局崩溃
			console.error('[EventPublisher] dispatchEvent error:', error);
		}
	}

	/**
	 * 添加事件监听器（类型安全，监听器不可为 null）
	 *
	 * @param {K} type - 事件类型
	 * @param {L} listener - 事件监听器
	 * @returns {void}
	 */
	public addEventListener<K extends string, L extends EventListenerOrEventListenerObject>(
		type: K,
		listener: L
	): void {
		try {
			this.eventTarget.addEventListener(type, listener);
		} catch (error) {
			// 捕获并输出添加监听器时的异常
			console.error('[EventPublisher] addEventListener error:', error);
		}
	}

	/**
	 * 移除事件监听器（类型安全，监听器不可为 null）
	 *
	 * @param {K} type - 事件类型
	 * @param {L} listener - 事件监听器
	 * @returns {void}
	 */
	public removeEventListener<K extends string, L extends EventListenerOrEventListenerObject>(
		type: K,
		listener: L
	): void {
		try {
			this.eventTarget.removeEventListener(type, listener);
		} catch (error) {
			// 捕获并输出移除监听器时的异常
			console.error('[EventPublisher] removeEventListener error:', error);
		}
	}
}

// 默认导出单例实例，方便直接使用
export default EventPublisher.getInstance();
